package com.cskaoyan.javase.oop3.innerclazz6.local4.basic1;

/**
 * @description: 局部内部类的访问特点
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 前提:
 * - 局部内部类相当于方法的局部变量，只在方法内部生效
 * - 要想触发局部内部类的类加载，必须在该方法内部创建该内部类对象才可以
 * 思考:
 * 在外围类的其他方法(不是定义局部内部类的方法)能不能访问这个局部内部类?
 * 必然不能访问,出了定义这个局部内部类的方法,就再也找不到它了
 * 所以你想触发它的类加载,必须要在这个方法当中去创建它的对象
 *
 * 1,局部内部类去访问外围类成员
 * 是可以任意访问的,不受访问权限限制
 * 2,外围类中的其他方法去访问局部内部类成员
 * 不能访问的,因为局部内部类只在方法内部生效
 * 3,我们其实是可以在外围类中访问这个内部类的(间接的)
 * 通过调用局部内部类的方法
 * 4,外部类更不能直接访问局部内部类
 *
 */
public class Demo {
    public static void main(String[] args) {

    }
}

class EnclosedClazz { //外围类
    int a;
    private int b = 20;
    static int c = 10;

    public static void main(String[] args) {
        EnclosedClazz enclosedClazz = new EnclosedClazz();
        enclosedClazz.test();
    }

    public void test() { //普通成员方法
        //可以直接访问外围类成员,因为普通成员方法隐含this指向当前对象 所以已经有对象 能够直接访问
        class InnerLocalClazz { //局部内部类
            //局部内部类的成员方法
            public void test() {
                System.out.println(a);
                System.out.println(b);
                System.out.println(EnclosedClazz.c);
            }
        }
        //在方法中创建对象
        //触发类加载 也只有这一种方式 只能在这里创建对象
        InnerLocalClazz innerLocalClazz = new InnerLocalClazz();
        //调用局部内部类的方法
        innerLocalClazz.test();
    }

    public static void testStatic() { //静态成员方法
        class InnerLocalClazz{
            //思考:这里能够直接访问外围类成员吗?
            //不能,原因是静态的方法没有当前对象
            public void test(){
                //System.out.println(b);
            }
        }

    }
}
